// @Description 认证控制器
// @Author  xiaoyang
// @Date  2025/11/26

package controllers

import (
	"github.com/gin-gonic/gin"
	"golang-manage-admin/http/modules/system/dto"
	"golang-manage-admin/http/modules/system/services"
)

type AuthController struct {
	Controller
	authService *services.AuthService
}

// Init 初始化认证控制器
func (auth *AuthController) Init() {
	auth.authService = &services.AuthService{}
}

// Login 用户登录
// @Tags     Auth
// @Summary  用户登录
// @Description 用户名密码登录
// @Accept   application/json
// @Produce  application/json
// @Param    data body dto.LoginForm true "登录参数"
// @Success  200  {object} controllers.ResponseFormat{data=dto.LoginResponse} "登录成功"
// @Failure  400  {object} controllers.ResponseFormat "参数错误"
// @Failure  401  {object} controllers.ResponseFormat "用户名或密码错误"
// @Router   /auth/login [post]
func (auth *AuthController) Login(c *gin.Context) {
	var form dto.LoginForm
	if err := form.BindValidParam(c); err != nil {
		auth.BadResponse(10000, err.Error(), c)
		return
	}

	// 调用 Service 层处理业务逻辑
	loginResponse, err := auth.authService.Login(&form, c.ClientIP())
	if err != nil {
		auth.BadResponse(20002, err.Error(), c)
		return
	}

	auth.JsonResponse(loginResponse, c)
}

// Register 用户注册
// @Tags     Auth
// @Summary  用户注册
// @Description 用户注册接口
// @Accept   application/json
// @Produce  application/json
// @Param    data body dto.RegisterForm true "注册参数"
// @Success  200  {object} controllers.ResponseFormat{data=object{message=string,user_id=uint}} "注册成功"
// @Failure  400  {object} controllers.ResponseFormat "参数错误"
// @Failure  409  {object} controllers.ResponseFormat "用户名或邮箱已存在"
// @Router   /auth/register [post]
func (auth *AuthController) Register(c *gin.Context) {
	var form dto.RegisterForm
	if err := form.BindValidParam(c); err != nil {
		auth.BadResponse(10000, err.Error(), c)
		return
	}

	// 调用 Service 层处理业务逻辑
	userID, err := auth.authService.Register(&form)
	if err != nil {
		auth.BadResponse(20005, err.Error(), c)
		return
	}

	auth.JsonResponse(gin.H{
		"message": "注册成功",
		"user_id": userID,
	}, c)
}

// GetUserInfo 获取用户信息
// @Tags     Auth
// @Summary  获取用户信息
// @Description 获取当前登录用户信息
// @Security ApiKeyAuth
// @Accept   application/json
// @Produce  application/json
// @Success  200  {object} controllers.ResponseFormat{data=dto.UserInfoResponse} "获取成功"
// @Failure  401  {object} controllers.ResponseFormat "未授权"
// @Router   /auth/userinfo [get]
func (auth *AuthController) GetUserInfo(c *gin.Context) {
	// 从JWT中获取用户信息
	userID, exists := c.Get("user_id")
	if !exists {
		auth.BadResponse(20007, "未授权访问", c)
		return
	}

	// 调用 Service 层处理业务逻辑
	userInfo, err := auth.authService.GetUserInfo(userID.(uint))
	if err != nil {
		auth.BadResponse(20008, err.Error(), c)
		return
	}

	auth.JsonResponse(userInfo, c)
}

// ChangePassword 修改密码
// @Tags     Auth
// @Summary  修改密码
// @Description 修改当前用户密码
// @Security ApiKeyAuth
// @Accept   application/json
// @Produce  application/json
// @Param    data body dto.ChangePasswordForm true "修改密码参数"
// @Success  200  {object} controllers.ResponseFormat{data=object{message=string}} "修改成功"
// @Failure  400  {object} controllers.ResponseFormat "参数错误"
// @Failure  401  {object} controllers.ResponseFormat "未授权或旧密码错误"
// @Router   /auth/change-password [post]
func (auth *AuthController) ChangePassword(c *gin.Context) {
	// 从JWT中获取用户信息
	userID, exists := c.Get("user_id")
	if !exists {
		auth.BadResponse(20007, "未授权访问", c)
		return
	}

	var form dto.ChangePasswordForm
	if err := form.BindValidParam(c); err != nil {
		auth.BadResponse(10000, err.Error(), c)
		return
	}

	// 调用 Service 层处理业务逻辑
	err := auth.authService.ChangePassword(userID.(uint), &form)
	if err != nil {
		auth.BadResponse(20009, err.Error(), c)
		return
	}

	auth.JsonResponse(gin.H{
		"message": "密码修改成功",
	}, c)
}

// Logout 用户登出
// @Tags     Auth
// @Summary  用户登出
// @Description 用户登出接口
// @Security ApiKeyAuth
// @Accept   application/json
// @Produce  application/json
// @Success  200  {object} controllers.ResponseFormat{data=object{message=string}} "登出成功"
// @Router   /auth/logout [post]
func (auth *AuthController) Logout(c *gin.Context) {
	// TODO: 将token加入黑名单（如果需要）
	// 这里主要是客户端删除token即可

	auth.JsonResponse(gin.H{
		"message": "登出成功",
	}, c)
}
